home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / util / linux / tofrodos-1.1 / init.c < prev    next >
C/C++ Source or Header  |  1999-09-11  |  5KB  |  211 lines

  1. /*
  2.     init.c        Initialisation functions.
  3.     Copyright (c) 1996 by Christopher S L Heng. All rights reserved.
  4.  
  5.     $Id: init.c 1.4 1996/12/16 17:49:13 chris Exp $
  6. */
  7.  
  8. /* this should always be first */
  9. #include "config.h"
  10.  
  11. /* standard headers */
  12. #if defined(HAVE_GETOPT_H)
  13. #include <getopt.h>    /* getopt() (what else?) */
  14. #endif
  15.  
  16. #include <signal.h>    /* signal() (surprise!) */
  17. #include <stdlib.h>    /* _splitpath(), _MAX_FNAME, exit, EXIT_SUCCESS */
  18. #include <stdio.h>    /* EOF */
  19. #include <string.h>    /* stricmp() */
  20.  
  21. #if defined(HAVE_UNISTD_H)
  22. #include <unistd.h>
  23. #endif
  24.  
  25. /* our own headers */
  26. #include "emsg.h"
  27. #include "tofrodos.h"
  28. #include "utility.h"
  29. #include "version.h"
  30.  
  31. /* macros */
  32. #define    HELPFMT        "Usage: %s [options] [file...]\n"\
  33.             "-a\tAlways convert (DOS to Unix: kill all CRs;\n"\
  34.             "\tUnix to DOS: convert all LFs to CRLFs)\n"\
  35.             "-b\tMake backup of original file (.bak).\n"\
  36.             "-d\tConvert DOS to Unix.\n"\
  37.             "-e\tAbort processing files on error in any file.\n"\
  38.             "-f\tForce: convert even if file is not writeable.\n"\
  39.             "-h\tDisplay help on usage and quit.\n"\
  40.             "-o\tOverwrite original file (no backup).\n"\
  41.             "-u\tConvert Unix to DOS.\n"\
  42.             "-v\tVerbose.\n"\
  43.             "-V\tShow version and quit.\n"
  44. #define    OPTLIST        "abdefhouvV"
  45. #define    VERFMT        "%s Ver %d.%d "\
  46.             "Converts text files between DOS and Unix formats.\n"\
  47.             "Copyright (c) 1996 by Christopher S L Heng. "\
  48.                         "All rights reserved.\n"
  49.  
  50. #if defined(MSDOS)
  51. #if !defined(_MAX_NAME) || (_MAX_NAME < 260)
  52. #define MAXFILESIZE    260
  53. #else
  54. #define    MAXFILESIZE    _MAX_NAME
  55. #endif
  56. #endif
  57.  
  58. #if !defined(MSDOS)
  59. #define    DIRSLASH    '/'
  60. #endif
  61.  
  62.  
  63. /* local functions */
  64. static void showhelp ( void );
  65. static void showversion ( void );
  66.  
  67. /*
  68.     init
  69.  
  70.     Checks for correct operating system version (DOS only).
  71.     Sets the default direction of conversion.
  72.     Sets the signal traps.
  73.  
  74.     Returns 0 on success, -1 on error.
  75. */
  76. int init ( char * firstarg )
  77. {
  78. #if defined(MSDOS)
  79.     char filename[MAXFILESIZE];
  80. #else
  81.     char * s ;
  82. #endif
  83.  
  84. #if defined(MSDOS)
  85.     /* Check that we have the minimum version of DOS needed. */
  86.     /* We only run on DOS 3.1 and above. */
  87.     if (_osmajor < 3 ||
  88.         (_osmajor == 3 && _osminor < 10)) {
  89.         fprintf( stderr, EMSG_WRONGDOSVER, progname );
  90.         return -1 ;
  91.     }
  92. #endif
  93.  
  94.     /* set the name of the binary to set default direction of */
  95.     /* conversion */
  96. #if defined(MSDOS)
  97.     /* got to extricate the name from the full path and extension */
  98.     _splitpath( firstarg, NULL, NULL, filename, NULL );
  99.     progname = xstrdup( filename );
  100. #else    /* not MSDOS - assume Unix */
  101.     /* got to wipe out the path prefix if any */
  102.     if ((s = strrchr( firstarg, DIRSLASH )) == NULL)
  103.         progname = firstarg ;
  104.     else { /* we got the last slash - let's get rid of it */
  105.         progname = ++s ;
  106.     }
  107. #endif
  108.  
  109.     /* set the default direction: Unless we are explicitly named */
  110.     /* to convert in a particular direction, the default direction */
  111.     /* depends on the system. If we are on a DOS system, it is to */
  112.     /* convert from Unix to DOS. If we are on a Unix system, it */
  113.     /* is to convert from DOS to Unix. */
  114.     if (!stricmp( progname, FROMDOSNAME ) ||
  115.         !stricmp( progname, FROMDOSNAME2 ))
  116.         direction = DOSTOUNIX ;
  117.     else if (!stricmp( progname, TODOSNAME ) ||
  118.         !stricmp( progname, TODOSNAME2 ))
  119.         direction = UNIXTODOS ;
  120.  
  121.     /* set the signal traps - we use the old Unix version 7 signal */
  122.     /* mechanism since that is most portable to DOS. In any case, */
  123.     /* we don't do anything sophisticated when we receive a signal */
  124.     /* except cleaning up and quitting! */
  125.     if (signal( SIGINT, sighandler ) == SIG_IGN)
  126.         signal( SIGINT, SIG_IGN );
  127.     if (signal( SIGTERM, sighandler ) == SIG_IGN)
  128.         signal( SIGTERM, SIG_IGN );
  129.  
  130.     return 0 ;
  131. }
  132.  
  133. /*
  134.     parseargs
  135.  
  136.     Parses the options.
  137.  
  138.         Returns 0 on success, -1 on error.
  139. */
  140. int parseargs ( int argc, char ** argv )
  141. {
  142.     int c ;
  143.  
  144.     while ((c = getopt( argc, argv, OPTLIST )) != EOF) {
  145.         switch( c ) {
  146.             case 'a': /* force conversion of all \r\n to \n */
  147.                 alwaysconvert = 1 ;
  148.                 break ;
  149.             case 'b': /* make backup of original file */
  150.                 overwrite = 0 ;
  151.                 break ;
  152.             case 'd': /* DOS to Unix */
  153.                 direction = DOSTOUNIX ;
  154.                 break ;
  155.             case 'e': /* abort processing list of files if */
  156.                   /* we encounter errors in any file in */
  157.                   /* a list of file names */
  158.                 abortonerr = 1 ;
  159.                 break ;
  160.             case 'f': /* convert even if file is not writeable*/
  161.                 forcewrite = 1 ;
  162.                 break ;
  163.             case 'h': /* display short usage screen and quit */
  164.                             showhelp() ;
  165.                 exit( EXIT_SUCCESS );
  166.                 break ;
  167.             case 'o': /* overwrite original file (default) */
  168.                             overwrite = 1 ;
  169.                             break ;
  170.             case 'u': /* Unix to DOS */
  171.                 direction = UNIXTODOS ;
  172.                 break ;
  173.             case 'v': /* verbose */
  174.                 verbose = 1 ;
  175.                 break ;
  176.             case 'V': /* show version and quit */
  177.                 showversion() ;
  178.                 exit( EXIT_SUCCESS );
  179.                 break ;
  180.             default:  /* error */
  181.                 return -1 ;
  182.         }
  183.     }
  184.     if (verbose)
  185.             showversion();
  186.     return 0 ;
  187. }
  188.  
  189. static void showversion ( void )
  190. {
  191.     static int vershown ;
  192.  
  193.     if (!vershown) {
  194.         printf( VERFMT, VERSN_PROGNAME, VERSN_MAJOR, VERSN_MINOR );
  195.         vershown = 1 ;
  196.     }
  197.     return ;
  198. }
  199.  
  200. /*
  201.     showhelp
  202.  
  203.     Display the short usage help screen.
  204. */
  205. static void showhelp ( void )
  206. {
  207.     showversion();
  208.     printf( HELPFMT, progname );
  209.     return ;
  210. }
  211.